package com.sojson.util.mq.rabbit.enums;

/**
 * Rabbit交换机类型枚举类
 * 
 * @author liu
 * @date 2022-06-15
 */
public enum ERabbitExchange {

    /**
     * 指定匹配</BR>
     * 按照routingkey分发到指定队列,处理路由键，需要将一个队列绑定到交换机上</BR>
     * 要求该消息与一个特定的路由键完全匹配,这是一个完整的匹配</BR>
     * 如果一个队列绑定到该交换机上要求路由键为 “green”,则只有路由键为“green”的消息才被转发</BR>
     * 不会转发路由键为“red”,只会转发路由键为“green”</BR>
     * 如果绑定交换机和发送消息的时候都没有指定routingkey,就和{@link ERabbitExchange#FANOUT}功能一样
     */
    DIRECT("direct"),
    /**
     * 模糊匹配</BR>
     * 功能和{@link ERabbitExchange#DIRECT}一样</BR>
     * 由指定匹配转为模糊匹配,支持“#”和“*”</BR>
     * 符号“#”匹配一个或多个词,符号“*”只能匹配一个词</BR>
     * 每个词之间用.分割</BR>
     * “#”和“*”只能在交换机和队列绑定的时候指定</BR>
     * 将路由键和某模式进行匹配,此时队列需要绑定要一个模式上</BR>
     */
    TOPIC("topic"),
    /**
     * 广播</BR>
     * 广播的前提是每个队列名称不一样,只会广播给所有名称不相同的某组队列中的一个</BR>
     * 如果一样,相同队列会采取轮训的方式</BR>
     * 你只需要简单的将队列绑定到交换机上</BR>
     * 一个发送到该类型交换机的消息都会被广播到与该交换机绑定的所有队列上</BR>
     */
    FANOUT("fanout"),
    /**
     * 用请求头(Map中的参数)指定匹配</BR>
     * 功能和{@link ERabbitExchange#DIRECT}一样</BR>
     * 把原来的参数匹配换成了请求头(Map中的参数)匹配</BR>
     * 请求头中必须包含x-match参数,值为all或any</BR>
     * all:表示需要全部匹配</BR>
     * any:表示只要匹配到headers表中的任何一个键值即可</BR>
     * 当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配</BR>
     * headers属性是一个键值对,可以是Hashtable</BR>
     * 键值对的值可以是任何类型,而fanout,exchange,topic 的路由键都需要要字符串形式的</BR>
     */
    HEADERS("headers"),
    /**
     * 需要配合延迟插件(消息延迟推送)rabbitmq_delayed_message_exchange使用</BR>
     */
    DELAYED_MESSAGE("x-delayed-message");

    /** 类型代码 */
    private String code;

    private ERabbitExchange(String code) {
        this.code = code;
    }

    /**
     * 获取类型代码
     * 
     * @return
     */
    public String getCode() {
        return code;
    }

    /**
     * 设置类型代码
     * 
     * @param code
     */
    public void setCode(String code) {
        this.code = code;
    }

}